package demo.day02

// 24 kotlin语言的简略写法
fun main() {
    // 第一种方式
//    loginApi1(USER_NAME_B, USER_PWD_B,{
//        msg:String,code:Int->println("最终登录情况如下===>msg:$msg,code:$code")
//    })
//    // 第二种方式
//    loginApi1(USER_NAME_B, USER_PWD_B, responseResult = {
//            msg:String,code:Int->println("最终登录情况如下===>msg:$msg,code:$code")
//    })
    // 第三种方式
    loginApi1(USER_NAME_B, USER_PWD_B) { msg: String, code: Int ->
        println("最终登录情况如下===>msg:$msg,code:$code")
    }
}

const val USER_NAME_B = "xiaopang"
const val USER_PWD_B = "123456"

// 登录API
// 此函数有使用lambda作为参数 就需要声明成内联
// 如果此函数不使用内联 在调用端会生成多个对象来调用 会造成性能损耗
//private fun loginApi1(userName: String, userPwd: String, responseResult: (String, Int) -> Unit) {
//    if (userName.isEmpty() || userPwd.isEmpty()) {
//        TODO("用户名或者密码为空") // 出现问题终止程序
//    }else{
//        if (userName.length > 3 && userPwd.length > 3) {
//            // 调用服务器
//            if (webServiceLoginApi(userName, userPwd)) {
//                println("登录成功，可以操作软件了")
//                responseResult("login success", 200)
//            } else {
//                // 登录失败的逻辑处理
//                println("登录失败，请重试")
//                responseResult("login error", 404)
//            }
//        } else {
//            TODO("用户名密码长度不合格")
//        }
//    }
//}

// 如果此函数使用内联 相当于C++ #defin 宏定义 宏替换 会把代码替换到调用处 没有任何函数开辟 对象开辟
// 小结 如果函数参数有lambda 尽量使用inline关键字 这样内部会做优化，减少函数开辟 对象开辟的损耗
private inline fun loginApi1(userName: String, userPwd: String, responseResult: (String, Int) -> Unit) {
    if (userName.isEmpty() || userPwd.isEmpty()) {
        TODO("用户名或者密码为空") // 出现问题终止程序
    }else{
        if (userName.length > 3 && userPwd.length > 3) {
            // 调用服务器
            if (webServiceLoginApi(userName, userPwd)) {
                println("登录成功，可以操作软件了")
                responseResult("login success", 200)
            } else {
                // 登录失败的逻辑处理
                println("登录失败，请重试")
                responseResult("login error", 404)
            }
        } else {
            TODO("用户名密码长度不合格")
        }
    }
}

// 此函数没有使用lambda作为参数，就不需要声明成内联
private fun webServiceLoginApi(name: String, pwd: String): Boolean {
    // kt的if是表达式 很灵活 java的if是语句 有局限性
    return name == USER_NAME_B && pwd == USER_PWD_B
}